package com.zjuh.goodboy.parsers;

import java.util.ArrayList;
import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.zjuh.goodboy.claw.ParseTemplate;
import com.zjuh.goodboy.claw.link.Link;
import com.zjuh.goodboy.context.AppContext;
import com.zjuh.goodboy.items.Item;
import com.zjuh.goodboy.store.link.NoItemLinkManager;
import com.zjuh.goodboy.util.JsoupUtil;
import com.zjuh.goodboy.util.URLUtil;
import com.zjuh.sweet.lang.StringUtil;

public class ExprParseTemplate implements ParseTemplate {

	private static final Logger log = LoggerFactory.getLogger(ExprParseTemplate.class);
	
	private ItemExpr itemExpr;
	
	private AppContext appContext;
	
	public ExprParseTemplate(ItemExpr itemExpr, AppContext appContext) {
		super();
		this.itemExpr = itemExpr;
		this.appContext = appContext;
	}

	@Override
	public List<Item> parse(Link link, String html) {
		Document doc = Jsoup.parse(html, URLUtil.getBaseUrl(link.getUrl()));
		List<Item> ret = new ArrayList<Item>();
		Elements itemElements = doc.select(itemExpr.getItemExpr());
		for (Element itemElement : itemElements) {
			Element urlElement = itemElement.select(itemExpr.getUrlExpr()).first();
			if (urlElement == null) {
				continue;
			}
			String text = JsoupUtil.getLinkText(urlElement);
			String url = urlElement.absUrl("href");
			Item item = new Item();
			item.setName(text);
			item.setUrl(url);
			item.setSiteName(itemExpr.getSiteName());
			Element imgElement = itemElement.select(itemExpr.getImgUrlExpr()).first();
			if (imgElement != null) {
				String imgSrc = imgElement.absUrl("imgsrc");
				if (StringUtil.isEmpty(imgSrc)) {
					imgSrc = imgElement.absUrl("src");
				}
				item.setImgUrl(imgSrc);
			}
			ret.add(item);
		}
		if (ret.isEmpty()) {
			log.warn("site item is empty:"+ itemExpr.getSiteName());
			((NoItemLinkManager)appContext.getObject("noItemLinkManager")).addNoItemLink(link);
		}
		return ret;
	}

	public ItemExpr getItemExpr() {
		return itemExpr;
	}

	public void setItemExpr(ItemExpr itemExpr) {
		this.itemExpr = itemExpr;
	}


}
